001 /*
002 * Copyright 2006 Stephen J. McConnell.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.metro.data;
020
021 import java.io.IOException;
022 import java.io.Writer;
023
024 import net.dpml.component.Controller;
025 import net.dpml.component.Composition;
026
027 import net.dpml.lang.Classpath;
028 import net.dpml.lang.Info;
029
030 import net.dpml.metro.builder.ComponentEncoder;
031
032 import net.dpml.util.Logger;
033
034
035 /**
036 * Component composition.
037 *
038 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
039 * @version 1.0.1
040 */
041 public final class DefaultComposition extends Composition
042 {
043 private ComponentDirective m_directive;
044
045 private final Classpath m_classpath;
046
047 /**
048 * Creation of a new composition diefinition.
049 * @param logger the assigned logging channel
050 * @param info the part info definition
051 * @param classpath the part classpath definition
052 * @param controller the deployment controller
053 * @param directive the deployment directive
054 * @exception IOException if an I/O exception occurs
055 */
056 public DefaultComposition(
057 Logger logger, Info info, Classpath classpath, Controller controller, ComponentDirective directive )
058 throws IOException
059 {
060 super( logger, info, classpath, controller, directive, directive.getName() );
061
062 m_directive = directive;
063
064 if( null != m_directive.getBaseDirective() )
065 {
066 // override the classpath defintion with a extended definition
067
068 DefaultComposition composition = m_directive.getBasePart();
069 Classpath base = composition.getClasspath();
070 m_classpath = new Classpath( base, classpath );
071 }
072 else
073 {
074 m_classpath = null;
075 }
076 }
077
078 /**
079 * Get the deployment directive.
080 * @return the deployment directive
081 */
082 public ComponentDirective getComponentDirective()
083 {
084 return m_directive;
085 }
086
087 /**
088 * Get the part classpath definition.
089 *
090 * @return the classpath definition
091 */
092 public Classpath getClasspath()
093 {
094 if( null != m_classpath )
095 {
096 return m_classpath;
097 }
098 else
099 {
100 return super.getClasspath();
101 }
102 }
103
104 /**
105 * Encode the deployment directive to XML.
106 * @param writer the output stream writer
107 * @param pad the outoput offset
108 * @exception IOException if an I/O exception occurs
109 */
110 protected void encodeStrategy( Writer writer, String pad ) throws IOException
111 {
112 ComponentEncoder encoder = new ComponentEncoder();
113 encoder.writeComponent( writer, m_directive, pad );
114 }
115
116 /**
117 * Return true if this object is equal to the supplied object.
118 * @param other the object to evaluate
119 * @return the equality status
120 */
121 public boolean equals( Object other )
122 {
123 if( super.equals( other ) && ( other instanceof DefaultComposition ) )
124 {
125 DefaultComposition composite = (DefaultComposition) other;
126 return m_directive.equals( composite.m_directive );
127 }
128 else
129 {
130 return false;
131 }
132 }
133
134 /**
135 * Return the hashcode for the instance.
136 * @return the instance hashcode
137 */
138 public int hashCode()
139 {
140 int hash = super.hashCode();
141 hash ^= m_directive.hashCode();
142 return hash;
143 }
144 }